# @Time : 2020/7/28 14:54
# @Author : Fioman 
# @Phone : 13149920693
import cv2 as cv
import numpy as np

"""
图像金字塔是由一副图像的多个不同分辨率的子图所构成的图像集合.该组图像是由单个图像通过不断地降采样所产生的,最小的图像可能只有一个像素点.
最简单的图像金字塔可以通过不断地删除图像的偶数行和偶数列得到.例如,有一幅图像,其大小是N*N,删除其偶数行和偶数列后得到一幅(N/2)*(N/2)大小的图像.
经过以上处理后,图像大小变为原来的四分之一,不断地重复该过程,就可以得到该图像的图像金字塔.
也可以先对原始图像滤波,得到原始图像的近似图像,然后将近似图像的偶数行和偶数列删除以获取向下采样的结果.有多重滤波器可以选择:
邻域滤波器:
采用邻域平均技术求原始图像的近似图像.该滤波器能够产生平均金字塔.
高斯滤波器:
采用高斯滤波器对原始图像进行滤波,得到高斯金字塔.这是OpenCV函数cv.pyrDown()所采用的方式.

在向上采样的过程中,通常将图像的宽度和高度都变为原来的2倍.这意味着,向上采样的结果图像的大小是原始图像的4倍.因此,要在结果图像中补充大量的像素点.
对新生成的像素点进行赋值,称为插值处理,该过程可以通过多种方式实现,例如最邻近插值就是用最邻近的像素点给当前还咩有值的像素点赋值.

有一种常见的向上采样,对像素点以补零的方式完成插值.通常是在每列像素点的右侧插入值为零的列,在每行像素点的下方插入值为零的行.
接下来,使用向下采样时所用的高斯滤波器(高斯核)对补零后的图像进行滤波处理,以获取向上采用的结果图像.
但是,需要注意,此时图像中的四分之三像素点的值都是零.所以,要将高斯滤波器系数乘以4,以保证得到向上范文在其原有向上值范围内.

pyrDown 函数以及使用.
Opencv提供了函数cv.pyrDown(),用于实现图像高斯金字塔操作中的向下采样,其语法形式为:
cv.pyrDwon(src,dstsize,borderType)
"""
img = cv.imread("test.bmp",cv.IMREAD_GRAYSCALE)

r1 = cv.pyrDown(img)
r2 = cv.pyrDown(r1)
r3 = cv.pyrDown(r2)

print("img.shape = {}".format(img.shape))
print("r1.shape = {}".format(r1.shape))
print("r2.shape = {}".format(r2.shape))
print("r3.shape = {}".format(r3.shape))

cv.imshow("Original",img)
cv.imshow("r1",r1)
cv.imshow("r2",r2)
cv.imshow("r3",r3)

cv.waitKey(0)
cv.destroyAllWindows()

up1 = cv.pyrUp(img)
up2 = cv.pyrUp(up1)
up3 = cv.pyrUp(up2)

print("img.shape = {}".format(img.shape))
print("up1.shape = {}".format(up1.shape))
print("up2.shape = {}".format(up2.shape))
print("up3.shape = {}".format(up3.shape))

cv.imshow("Original",img)
cv.imshow("up1",up1)
cv.imshow("up2",up2)
cv.imshow("up3",up3)

cv.waitKey(0)
cv.destroyAllWindows()































